iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
Modern Web

JS 忍者訓練計畫系列 第 6

函示乃基本礎石(上) Day5

  • 分享至 

  • xImage
  •  

明白 JavaScript 是一個函數式語言是成為 JS 忍者的重要一步,函式除了無所不在,函式也為重要的模組化單元。函式使用發生在不同的事件場景,包含瀏覽器事件及其生命週期、網路事件(Ajax)、使用者事件(click)、
計時器事件等等,而函數可被呼叫,呼叫執行往往是非同步。後面還會講到更細部的事件迴圈,理解這些複雜的函式是如何運作的,但就先從宣告開始吧。

這章想學到什麼?

  • 函數是頭等物件是什麼意思?
  • 你能想出幾種函示宣告的姿勢(10)? 還有更多嗎?
  • 函式與 scope,以及其好朋友 hoisting

程式碼閱讀練習與撰寫

函數是頭等物件是什麼意思? 什麼是 JS 的函數式特質?

  • 可透過字面值(literal)來產生
  • 可指派給變數、陣列元素、以及其他物件的屬性(property)
const obj = {}
obj.foo = function () {

}
  • 可當作參數傳入函式
  • 可當作函式的回傳值
function foo(callback) {
  return callback()
}

這裡的 callback 指的是,我們先設定好某函式,但之後才會被呼叫。

  • 可擁有能夠動態建立和指派的屬性
function Foo () {
    this.ninja = function {
        return this;
    };
}

你能想出幾種函示宣告的姿勢? (10)

//一般函式
function foo ( ) {
    statements
}
//透過樣本字面產生
const foo = function () {
    statements
}
//物件方法
const obj = () => {
   foo: function () {
       statements
   }
}
//立即函式
(function () {
  statements
})();

//生成器函式
function* name([param[, param[, ... param]]]) {
  statements
}
//箭頭函式
const foo = () => {
  statements
}
const obj = () => {
   foo = () => {
      statements
    }
}
(() => {
      statements
})();
//函式建構式
function Foo() {
  this.inner = function() {
      return this
  }
}
//Function 建構函式
let foo = new Function('a', 'b', 'return a + b');

函式與 scope,以及其好朋友 hoisting

function outer () {
  var a = 1;
  console.log(inner1())
  console.log(inner2())
  function inner1(){
      return "I am inner1"
  }
  var inner2 = function () {
      return "I am inner2"
  }
  var b = 2;
  if(a == 1) {
    var c = 3;
  }
}
outer()

為什麼 inner1 會過,inner2 不會過呢? 直到函式結尾。而內部具名函式會被 hoisting,所以可以在 outter 以內的範圍任意使用。但變數僅 hoisting 宣告的部分,而不包含初始化(將值或匿名函式指派給變數的部分)。

No matter what the problem is, it's always a people problem.

參考資料

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions
https://developer.mozilla.org/zh-TW/docs/Glossary/Hoisting


上一篇
裝備測試與除錯工具(下) Day4
下一篇
函示乃基本礎石(下) Day6
系列文
JS 忍者訓練計畫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言